package org.jaaksi.test.webview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * Created by Fcy on 2016/4/25.
 */
public abstract class BaseWebViewActivity extends Activity {
    protected WebView mWebView;
    protected LoadingBar mProgressBar;
    protected String currentUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView();
        mWebView = (WebView) findViewById(R.id.webView);
        mProgressBar = new LoadingBar(this);

        setUpWebView(mWebView);
        currentUrl = initCurrUrl();
        load(currentUrl);
    }

    @Override
    protected void onDestroy() {
        mProgressBar.dismiss();
        super.onDestroy();
    }

    protected abstract void setContentView();

    protected abstract String initCurrUrl();

    protected WebView getWebView() {
        return mWebView;
    }

    private void load(String url) {
        mWebView.loadUrl(url);
    }

    protected void registerJS() {
    }

    protected boolean shouldOverrideUrlLoading(WebView view, String url) {
        mWebView.loadUrl(url);
        return true;
    }

    public void onProgressChanged(WebView view, int newProgress) {
        if (!isFinishing()) {
            mProgressBar.show(getWindow().getDecorView());
        } else {
            mProgressBar.dismiss();
        }
        if (newProgress == 100) {
            mProgressBar.dismiss();
        }
    }

    protected void onPageFinished(WebView view, String url) {

    }

    protected void setWebViewClient() {
        mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) { // h5中跳转，会调用这个方法,url会改变
                return BaseWebViewActivity.this.shouldOverrideUrlLoading(view,
                    url);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                mProgressBar.dismiss();
                currentUrl = url;
                BaseWebViewActivity.this.onPageFinished(view, url);

                // 必须在页面加载完成后才能注入，注入信息后，界面会自动重新加载一下，所以会调用两次onPageFinished方法
                // mWebView.loadUrl(
                // "javascript:globalInfo(" + getRequestString() + ")");

                if (!BaseWebViewActivity.this.mWebView.getSettings()
                    .getLoadsImagesAutomatically()) {
                    BaseWebViewActivity.this.mWebView.getSettings()
                        .setLoadsImagesAutomatically(true);
                }

                super.onPageFinished(view, url);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

        });
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void setUpWebView(final WebView mWebView) {
        mWebView.setVerticalScrollBarEnabled(true);
        mWebView.setHorizontalScrollBarEnabled(false);
        mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        // mWebView.setInitialScale(1);
        // mWebView.getSettings().setDomStorageEnabled(true);

        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setJavaScriptEnabled(true);
        // 设置可以支持缩放
        mWebView.getSettings().setSupportZoom(true);
        // 设置出现缩放工具
        mWebView.getSettings().setBuiltInZoomControls(true);
        // 扩大比例的缩放
        mWebView.getSettings().setUseWideViewPort(true);
        // 自适应屏幕
        mWebView.getSettings()
            .setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        mWebView.getSettings().setLoadWithOverviewMode(true);

        // 是否允许Cache，默认false。考虑需要存储缓存，应该为缓存指定存储路径setAppCachePath
        mWebView.getSettings().setAppCachePath("databasePath");
        // 是否允许Cache，默认false。考虑需要存储缓存，应该为缓存指定存储路径setAppCachePath
        mWebView.getSettings().setAppCacheEnabled(true);
        /**
         * 基于WebView导航的类型使用缓存：正常页面加载会加载缓存并按需判断内容是否需要重新验证。
         * 如果是页面返回，页面内容不会重新加载，直接从缓存中恢复。setCacheMode允许客户端根据指定的模式来
         * 使用缓存。
         * LOAD_DEFAULT 默认加载方式
         * LOAD_CACHE_ELSE_NETWORK 按网络情况使用缓存
         * LOAD_NO_CACHE 不使用缓存
         * LOAD_CACHE_ONLY 只使用缓存
         */
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        // 如果webView中需要用户手动输入用户名、密码或其他，则webview必须设置支持获取手势焦点
        mWebView.requestFocusFromTouch();

        // mWebView.getSettings()
        // .setUserAgentString(mWebView.getSettings().getUserAgentString()
        // + " Lianjia/" + DeviceUtil.getVersionName(this));
        // mWebView.setInitialScale(70);
        this.mWebView.getSettings().setLoadsImagesAutomatically(true);

        registerJS();

        setWebViewClient();

        this.mWebView.setWebChromeClient(new WebChromeClient() { // 处理进度
            public void onProgressChanged(WebView view, int newProgress) {
                BaseWebViewActivity.this.onProgressChanged(view, newProgress);
            }
        });

    }

}
